"""
如果特征数量特别多，可以使用特征降维将一些相关性比较低的特征删除掉
当特征选择完成后，可以直接训练模型了，但是可能由于特征矩阵过大，导致计算量大，训练时间长的问题，因此降低特征矩阵维度也是必不可少的。
降维（dimensionality reduction）是指通过对原有的feature进行重新组合，形成新的feature，选取其中的principal components主要特征。


方式：
1 特征选择：数据中包含冗余或无关变量（或称特征、属性、指标等），旨在从原有特征中找出主要特征。
    Filter(过滤式)：主要探究特征本身特点、特征与特征和目标值之间关联
        方差选择法：低方差特征过滤
        相关系数

    Embedded (嵌入式)：算法自动选择特征（特征与目标值之间的关联）
        决策树:信息熵、信息增益
        正则化：L1、L2
        深度学习：卷积等

2 主成分分析(PCA)（可以理解一种特征提取的方式）
通过对数据维数进行压缩，尽可能降低原数据的维数（复杂度），损失少量信息，在此过程中可能会舍弃原有数据、创造新的变量    。
"""

import pandas as pd
from sklearn.feature_selection import VarianceThreshold
def variance_filter():
    """
    方差选择法
    删除方差比较低的一些特征，前面讲过方差的意义（方差越大说明数据波动大，相差较大；方差越小说明数据波动小，相差较小）。
    再结合方差的大小来考虑这个方式的角度。

    特征方差小：说明某个特征在大多样本中比较相近
    特征方差大：某个特征跟很多样本的值都有差别

    举例：
    a
    5
    4
    5
    4
    3
    这个特征a明显方差小，在大多样本中比较相近，所以可能可以去掉，因为这个特征可能是个大众特征
    :return:
    """
    # 读取特征
    data = pd.read_csv("./factor_returns.csv")
    data = data.iloc[:, 1:-2]
    print(data)

    # 实例化一个方差过滤器 threshold是方差值默认0
    filter = VarianceThreshold(threshold=1)
    filted_data = filter.fit_transform(data)

    print("方差过滤后的数据:\n",filted_data)
    print(filted_data.shape)
    return None

from scipy.stats import pearsonr
def pearsonr_demo():
    """
    相关系数计算，计算两个特征之间的相关系数
    皮尔逊相关系数(Pearson Correlation Coefficient) 反映变量之间相关关系密切程度的统计指标

    相关系数的值介于–1与+1之间，即–1≤ r ≤+1。其性质如下：
    当r>0时，表示两变量正相关，一个越大另一个也越大；r<0时，两变量为负相关，一个越大另一个越小
    当|r|=1时，表示两变量为完全相关，当r=0时，表示两变量间无相关关系
    当0<|r|<1时，表示两变量存在一定程度的相关。且|r|越接近1，两变量间线性关系越密切；|r|越接近于0，表示两变量的线性相关越弱
    一般可按三级划分：|r|<0.4为低度相关；0.4≤|r|<0.7为显著性相关；0.7≤|r|<1为高度线性相关

    特征与特征之间相关性很高：
        1）选取其中一个作为代表
        2）加权求和
        3）主成分分析
    :return: None
    """
    data = pd.read_csv("./factor_returns.csv")

    r1 = pearsonr(data.get("revenue"),data.get("total_expense"))

    # PearsonRResult(statistic=0.9958450413136115, pvalue=0.0) statistic皮尔逊相关系数
    print("revenue与total_expense之间的相关性：\n", r1)
    return None

from sklearn.decomposition import PCA
def pca_demo():
    """
    pca降维
    :return:
    """
    feature_data = [[2, 8, 4, 5], [6, 3, 0, 8], [5, 4, 9, 1]]
    # 实例化一个转换器 n_components 整数n特征降维到n个，浮点数f表示特征数据保留百分之多少的信息
    # transfer = PCA(n_components=0.95)
    transfer = PCA(n_components=2)
    feature_data_new = transfer.fit_transform(feature_data)
    print(feature_data_new)
    return None

if __name__ == '__main__':
    # variance_filter()

    # pearsonr_demo()

    # pca_demo()
    data = pd.read_csv("./factor_returns.csv")
    print(type(data))
    print(data)